# 形态学变换：基于图像形状的一些简单操作 一般基于单通道图处理（常用灰度图）
# 一般有两个输入 1 操作的图片 2 要变换的机构元素或核
# 两种基本的形态学变换是侵蚀和膨胀 他们的变种也有张开和闭合

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('./test.img')
print(img.shape)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print(gray.shape)
plt.imshow(gray,cmap='gray')

# 侵蚀
# 作用 去除白色噪点 将两个连起来的形状打散  

# 3x3 , 1
kernel = np.ones((3,3), dtype = np.int8)
ersion1 = cv2.erode(gray.copy(),kernel,iterations = 1)
plt.imshow(ersion1,cmap='gray')

# 5x5 , 1
kernel = np.ones((5,5),dtype = np.int8)
ersion2 = cv2.erode(gray.copy(),kernel,iteration = 1)
plt.imshow(ersion2,cmap='gray')

# 5x5 , 2
kernel = np.ones((5,5),dtype = np.int8)
ersion3 = cv2.erode(gray.copy(),kernel,iteration = 2)
plt.imshow(ersion2,cmap='gray')

fig,(ax1,ax2,ax3,ax4) = plt.subplots(1,4,figsize=(20,8),sharex=True,sharey=True)# 一行4列
ax1.axis('off')
ax1.imshow(gray.copy(),cmap='gray')
ax1.set_title('origin image')
ax2.axis('off')
ax2.imshow(ersion1,cmap='gray')
ax2.set_title('3x3,1')
ax3.axis('off')
ax3.imshow(ersion2,cmap='gray')
ax4.axis('off')
ax4.imshow(ersion3,cmap='gray')

# 膨胀
# 作用 跟在侵蚀操作后去噪点 把两个分开的部分 连接起来
plt.imshow(gray.copy(),cmap='gray')

kernel = np.ones((3,3), dtype = np.int8)
dalation1 = cv2.dilate(gray.copy(),kernel,iterations = 1)

kernel = np.ones((5,5),dtype = np.int8)
dalation2 = cv2.dilate(gray.copy(),kernel,iterations = 2)

# opening，张开
# 侵蚀+膨胀
# 主要用于清除噪点
img = cv2.imread('./test.img')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.imshow(gray,cmap='gray')

kernel = np.ones((10,10), dtype = np.int8)
opening1 = cv2.morphologyEx(gray.copy(),cv2.MORPH_OPEN,kernel)

plt.imshow(opening1,cmap='gray')

# closing，闭合
# 主要用于 闭合主体内的小豆  或者是一些黑点
# 先膨胀再侵蚀

kernel = np.ones((15,15), dtype = np.int8)
closing1 = cv2.morphologyEx(gray.copy(),cv2.MORPH_CLOSE,kernel)
plt.imshow(closing1)
# 会发现 图片中的字母的一些空洞都闭合上了 

# canny edge detection 
# 边缘检测算法主要步骤如下：
# 1.高斯模糊降噪
# 2.使用sobel filter计算图片像素梯度
# 3.NMS非最大值移植计算局部最大值
# 5.Hysteresis thresholding 滞后阈值法过滤

# 有个大阈值和小阈值 
# 如果有一条线的像素值均匀变化 
# 其中有超过大阈值或低于小阈值
# 这条线会被认为是真正的边界点

img.cv2.imread('./test_imgs/pumpking.jpg')
img_fixed = cv2.cvtColor(img,cv2.COLOR_BGR2GRGB)
plt.imshow(img_fixed)

edges1 = cv2.Canny(img.copy(), 100, 200)
edges2 = cv2.Canny(img.copy(), 50, 200)
edges3 = cv2.Canny(img.copy(), 50, 100)

fig,(ax2,ax3,ax4) = plt.subplots(1,3,figsize=(20,8),sharex=True,sharey=True)# 一行4列

ax2.axis('off')
ax2.imshow(edges1,cmap='gray')
ax3.axis('off')
ax3.imshow(edges2,cmap='gray')
ax4.axis('off')
ax4.imshow(edges3,cmap='gray')

